﻿/*
 * 反射
 * 
 * **/
//反射的命名空间有两个
//System.Type
//System.Reflection


//获取程序集，有三种方式
using Max.PH4_2101A.ShoppingAdmin.FuXi.DTO;
using System.ComponentModel.DataAnnotations;



////绝对路径
//var a = System.Reflection.Assembly.LoadFile(@"G:\ProgramCode\TeachingCode\20230316_0712.2101A.PH4\src\Max.PH4_2101A.ShoppingAdmin.FuXi\Max.PH4_2101A.ShoppingAdmin.FuXi.DTO\bin\Debug\net6.0\Max.PH4_2101A.ShoppingAdmin.FuXi.DTO.dll");
////相对路径
////var b = System.Reflection.Assembly.Load(@"Max.PH4_2101A.ShoppingAdmin.FuXi.DTO");
////可相对也可绝对
////var c = System.Reflection.Assembly.LoadFrom(@"Max.PH4_2101A.ShoppingAdmin.FuXi.DTO.dll");
////以上三种方式的区别就是：相对路径和绝对路径

//a.GetTypes().ToList().ForEach(t =>
//{
//    //global::System.Console.WriteLine(t.Name);

//    if(t.Name.Equals("ResponseResultDto"))
//    {
//        //实例化这个类
//        var o =Activator.CreateInstance(t);

//        //拿到这个类中的某个方法
//        var m = t.GetMethod("MyIsMethod");

//        //执行这个方法
//        var res =  m.Invoke(o, null);

//        //打印出这个方法的结果
//        global::System.Console.WriteLine(res);


//        //1、获取构造函数
//        //t.GetConstructors().ToList().ForEach(c => {
//        //    global::System.Console.WriteLine(c.Name);
//        //});

//        //2、获取字段
//        //t.GetFields().ToList().ForEach(f => {
//        //    global::System.Console.WriteLine(f.Name);
//        //});

//        //3、获取成员
//        //t.GetMembers().ToList().ForEach(m => {
//        //    global::System.Console.WriteLine(m.Name);
//        //});

//        //4、获取方法
//        //t.GetMethods().ToList().ForEach(m =>
//        //{
//        //    global::System.Console.WriteLine(m.Name);
//        //});

//        //5、获取属性
//        //t.GetProperties().ToList().ForEach(p => {
//        //    global::System.Console.WriteLine(p.Name);
//        //});

//        //6、获取事件
//        //t.GetEvents().ToList().ForEach(e => { 
//        //});
//    }

//});



//var r = typeof(ResponseResultDto);

//r.GetConstructors  //构造函数
//r.GetEvents
//r.GetMembers
//r.GetMethods
//r.GetFields
//r.GetProperties


var y = typeof(MyEnum);

List<dynamic> list = new List<dynamic>();
y.GetFields().ToList().ForEach(x => {
     //global::System.Console.WriteLine(x.Name);

    if (!x.Name.Equals("value__"))
    {
        int value = (int)Enum.Parse(y, x.Name);

        var os = x.GetCustomAttributes(typeof(DisplayAttribute), true);
        var name = "";
        if (os != null && os.Length > 0)
        {
            name = ((DisplayAttribute)os[0]).Name;
        }
        else
        {
            name = x.Name;
        }
        //global::System.Console.WriteLine(value);
        list.Add(new { name, value });
    }

});

list.ForEach(x =>
{
    global::System.Console.WriteLine(x.name + "----" + x.value);
});


Console.ReadKey();


enum MyEnum
{
    [Display(Name = "待支付")]
    WaitingPay,
    WaitingComifre,
    Finished
}